package com.alstudio.module.xmpp.protocol.xmpp;

import java.util.ArrayList;

import com.alstudio.module.xmpp.protocol.xmpp.data.ALXmppConnectionState;
import com.alstudio.module.xmpp.protocol.xmpp.data.VauthData;
import com.alstudio.module.xmpp.protocol.xmpp.data.economic.EconomicRecords;
import com.alstudio.module.xmpp.protocol.xmpp.data.economic.RechargeItem;
import com.alstudio.module.xmpp.protocol.xmpp.packact.ALMessage;
import com.alstudio.pojo.module.dating.DatingUser;
import com.alstudio.pojo.module.local.Prop;
import com.alstudio.pojo.module.local.Props;
import com.alstudio.pojo.module.user.User;
import com.alstudio.utils.notification.SystemSettings;

/**
 * xmpp网络层回调接口。所有网络数据首先会调用这些接口，在XmppAdapter处理网络数据后，再抛到主线程。
 * 
 */
public interface ALXmppListener {

	/**
	 * 当无法连接到XMPP服务器时，此回调将被执行
	 */
	public void onJxaConnFailed(final String msg, final String conflictSid);

	/**
	 * 当无法连接到XMPP服务器时，此回调将被执行
	 */
	public void onJxaConnFailed(final String msg);

	/**
	 * 当登陆连接服务器的状态发生变化时，此回调将被执行
	 * 
	 * @param state
	 */
	public void onJxaConnStateChange(ALXmppConnectionState state,
			ALXmppConnectionState lastState);

	/**
	 * 当成功登陆服务器后，此回调将被执行
	 */
	public void onJxaAuth(final String username, String passwrod, String token);

	/**
	 * 当出现账号验证失败时，此回调将被执行
	 * 
	 * @param 登录失败的原因
	 */
	public void onJxaAuthFailed(final String ALMessage);

	/**
	 * 当服务器响应客户端注销登录请求时，此回调将被执行。
	 * 
	 * @param result
	 *            true表示注销成功 false表示注销失败。
	 * @author alonso lee
	 */
	public void onJxaLogoutEvent(boolean result);

	/**
	 * 更新session id
	 * 
	 * @param sid
	 */
	public void onJxaSessionIdUpdateEvent(String sid);

	/**
	 * @param user
	 *            更改状态的电话号码
	 * @param show
	 *            具体状态。取值范围为"online"和"offline"
	 * @param timeStamp
	 *            当show为"online"时，timeStamp为null。否则，timeStamp为离线时间
	 */
	public void onJxaStatusEvent(final String user, final String show);

	/**
	 * 当登陆成功后，在运行过程中出现异常情况时，此回调将被执行
	 * 
	 * @param code
	 * @param nameSpace
	 */
	public void onJxaErrorOccur(final String code, final String nameSpace);

	/**
	 * 接收到消息
	 * 
	 * @param msg
	 * @author alonso lee
	 */
	public void onJxaALMessageEvent(final ALMessage msg);

	/**
	 * 当收到消息回执时，此回调将被执行
	 * 
	 * @param from
	 * @param id
	 * @param info
	 *            消息状态
	 * @author alonso lee
	 */
	public void onJxaGetALMessageBackEvent(final String from, final String id);

	/******************************************* 70---129行的代码因cardboxing项目用不到，暂时关闭 ********************************************************************/
	/**
	 * This event occurs when someone has removed you from his roster (o rly?)
	 * 
	 * @param jid
	 *            the jid of the remover
	 */
	// public void onContactRemoveEvent(final String jid);

	/**
	 * This event occurs for each contact in roster when the roster is queried.
	 * 
	 * @param jid
	 *            the jid of the contact
	 * @param name
	 *            the nickname of the contact
	 * @param group
	 *            the group in which the contact is saved
	 * @param subscription
	 *            the subscription status of the contact
	 */
	// public void onJxaContactEvent(final String jid, final String name, final
	// String group, final String subscription);

	// public void onJxaContactOverEvent();
	/**
	 * <p>
	 * This event occurs when a presence ALMessage comes from jabber server.
	 * This can also be your own jid. The presence can be one of the following:
	 * </p>
	 * 
	 * <ul>
	 * <li><code>blank</code>: user is online</li>
	 * <li>chat: user is free to chat</li>
	 * <li>away: user is away</li>
	 * <li>xa: user is not available (extended away).</li>
	 * <li>dnd: user is busy (do not disturb).</li>
	 * </ul>
	 * 
	 * <p>
	 * An offline user will send no status ALMessage at all.
	 * </p>
	 * 
	 * @param user
	 *            更改状态的电话号码
	 * @param show
	 *            具体状态。取值范围为"online"和"offline"
	 * @param timeStamp
	 *            当show为"online"时，timeStamp为null。否则，timeStamp为离线时间
	 */
	// public void onJxaStatusEvent(final String user, final String show, final
	// String timeStamp);

	/**
	 * This event is sent when a subscription request arrives. This means
	 * someone has allowed you to see his status.
	 * 
	 * @param jid
	 *            the jid of the one who wants to subscribe to you
	 */
	// public void onJxaSubscribeEvent(final String jid);

	/**
	 * This event is sent when a subscription remove event arrives. This means
	 * someone has taken away your right to see his status.
	 * 
	 * @param jid
	 *            the jid of the one who removes your subscription
	 */
	// public void onJxaUnsubscribeEvent(final String jid);

	/**********************************************************************************************************/

	// 关于注册的回调通知

	/**
	 * 得到服务器下发注册的信息后通过此回调通知上层
	 * 
	 * @param userName
	 *            服务器下发的对应此IMEI的用户名。只有在注册成功或者服务器有此imei信息时才会下发账号密码
	 * @param passWord
	 *            对应userName的密码
	 */
	public void onJxaRegisterEvent(final String jid, final String password,
			final String user, final int code);

	/**
	 * 当服务下发第三方登录结果时,此回调将被执行
	 * 
	 * @param uid
	 * @param password
	 */
	public void onJxaThirdPartLoginResult(String uid, String password);

	/**
	 * 当服务下发检测email是否已经注册过结果时,此回调将被执行
	 * 
	 * @param uid
	 * @param password
	 */
	public void onJxaCheckEmailResult(boolean isRegistered);

	/**
	 * 当收到服务器下发的心跳包时通知上层
	 * 
	 * @param type
	 *            此条心跳包的类型。取值范围: "0" 服务器下发的S2C心跳包，程序必须响应。否则服务器将把连接断开 "1"
	 *            服务器响应本程序上传的C2S心跳包。证明当前连接正常
	 * @param id
	 *            此条心跳包的id号
	 */
	public void onJxaGetPingEvent(int type, String id, String from, String to);

	/************************************************************ voip ****************************************************************/

	/**
	 * 解析拨打电话结果
	 * 
	 * @param code
	 *            0标示拨打成功，否則為失敗
	 * @param session
	 *            拨打成功后的session id null标示失败
	 */
	public void onJxaGetMakeVoipCallResult(int code, String session);

	/**
	 * 解析接听电话结果
	 * 
	 * @param code
	 *            0标示接听成功，否則為失敗
	 * @param sessionId
	 *            接听成功后的session id null标示失败
	 * @param ip
	 *            接听成功后的对方ip null标示失败
	 * @param port
	 *            接听成功后的对方端口 -1标示失败
	 */
	public void onJxaGetAcceptVoipCallResult(int code, String sessionId,
			ALMessage msg);

	/**
	 * 解析拒绝来电结果
	 * 
	 * @param sessionId
	 *            拒绝来电后的session id
	 */
	public void onJxaGetRejectVoipCallResult(String sessionId);

	/**
	 * 解析挂断电话结果
	 * 
	 * @param sessionId
	 *            挂断来电后的session id
	 */
	public void onJxaGetHandUpVoipCallResult(String sessionId);

	/**
	 * 进入爆米花结果。
	 * 
	 * @param code
	 *            0表示成功，其他表示失败
	 */
	public void onJxaGetEnterBaoMiHuaResult(int code);

	/**
	 * 退出爆米花结果
	 * 
	 * @param code
	 *            0表示成功，其他表示失败
	 */
	public void onJxaGetExitBaoMiHuaResult(int code);

	/**
	 * 进入邂逅结果
	 * 
	 * @param code
	 *            0表示成功，其他表示失败
	 * @param hasMore
	 *            true表示还有更多
	 * @param users
	 *            当且仅当code等于0时，users才有数据
	 */
	public void onJxaGetXiehouResult(int code, boolean hasMore, DatingUser users);

	/******************************** 用戶相關操作 **********************************/

	/**
	 * 请求发现用户结果
	 * 
	 * @param code
	 * @param hasMore
	 * @param users
	 */
	public void onJxaGetDiscoveryUsersResult(final int code,
			final boolean hasMore, ArrayList<User> users);

	/**
	 * 请求发现用户结果
	 * 
	 * @param code
	 * @param hasMore
	 * @param users
	 */
	public void onJxaGetSearchUsersResult(String type, int code,
			boolean hasMore, ArrayList<User> users);

	/**
	 * 当服务器响应请求热榜时，此回调将被执行
	 * 
	 * @param type
	 *            返回的表单类型。0表示魅力榜、1表示富豪榜、2表示女神帮
	 * @param code
	 * @param hasMore
	 * @param users
	 */
	public void onJxaGetRankUsersResult(final int type, final int code,
			final boolean hasMore, ArrayList<User> users);

	/**
	 * 当服务器响应请求好友列表或者粉丝列表时，此回调将被执行
	 * 
	 * @param type
	 *            返回的表单类型。0表示好友、1粉丝
	 * @param code
	 * @param hasMore
	 * @param users
	 */
	public void onJxaGetFriendsAndFansResult(final int type, final int code,
			final boolean hasMore, ArrayList<User> users, final int count,
			final String version);

	/**
	 * 当服务器想要请求删除好友或者粉丝时，此回调将被执行
	 * 
	 * @param type
	 *            删除类型，0标示好友，1标示粉丝,2表示刪除特別關注
	 * @param count
	 *            剩余条目
	 * @param version
	 *            当前版本号
	 * @param jid
	 *            被删除jid
	 */
	public void onJxaGetDeletFriendOrFansResult(final int type,
			final int count, final String version, final String jid,
			final int code);

	/**
	 * 当服务器响应添加普通关注或者特别关注时，此回调将被执行
	 * 
	 * @param type
	 *            0表示普通关注 1表示特别关注
	 * @param code
	 *            0表示成功，其他别是失败
	 * @param version
	 *            关注过后的版本号
	 * @param user
	 *            已关注用户
	 */
	public void onJxaGetAddNormalOrSpecialFavoritesResult(final int type,
			final int code, String version, User user);

	/**
	 * 当服务器响应设定用户备注名时，此回调将被执行
	 * 
	 * @param code
	 *            0表示成功，其他别是失败
	 * @param jid
	 *            成功设置备注名的用户jid
	 */
	public void onJxaSetUserNoteNameResult(final int code, String jid);

	/**
	 * 當服務器響應獲取用戶資料時,此囘調將被執行
	 * 
	 * @param code
	 *            0表示成功，其他别是失败
	 * @param u
	 *            當且僅當code為0時有效
	 */
	public void onJxaGetUserProfileResult(final int code, User u);

	/**
	 * 当服务器响应修改用户资料时，此回调将被执行
	 * 
	 * @param code
	 *            0表示成功，其他别是失败
	 */
	public void onJxaGetModifyUserProfileResult(final int code);

	/******************************** 賬號設置 *************************************************/
	/**
	 * 当服务器响应更改密码请求时，此回调将被执行
	 * 
	 * @param code
	 *            0 表示更改成功；404表示密码长度不符合要求；403表示还没有绑定自定义账号；402表示原密码不对
	 * @author alonso lee
	 */
	public void onJxaChangePasswordEvent(int code, String newPwd);

	/**
	 * 当V认证成功时，此回调将被执行
	 * 
	 * @param
	 */
	public void onJxaVAuthetication(final int code, VauthData data);

	/**
	 * V认证状态
	 * 
	 * @param status
	 */
	public void onJxaVAutheticationState(final int code, VauthData data);

	/**
	 * 提交语音介绍结果
	 * 
	 * @param code
	 */
	public void onJxaCommitVoiceIntroEvent(final int code);

	/**
	 * 获取服务器上的用户配置
	 * 
	 * @param code
	 * @param settings
	 */
	public void onJxaGetUserOptEvent(final int code, SystemSettings settings);

	/*********************************** 經濟系統 **********************************************/

	/**
	 * 当服务器响应清除账单或者积分清单时，此回调将被执行
	 * 
	 * @param code
	 *            0 表示更改成功，其他为失败
	 * @param type
	 *            0表示清空账单，1表示清空积分
	 */
	public void onJxGetClearMoneyOrPointHistoryResult(int code, int type);

	/**
	 * 当服务器响应获取用户积分时，此回调将被执行
	 * 
	 * @param code
	 *            0 表示更改成功，其他为失败
	 * @param points
	 *            用户积分
	 */
	public void onJxaGetUserPointsResult(int code, String points);

	/**
	 * 当服务器想要获取账单或者积分清单时，此回调将被执行
	 * 
	 * @param code
	 *            0 表示更改成功，其他为失败
	 * @param type
	 *            0标示账单，1标示积分
	 * @param records
	 *            当且仅当code为0时数据才有效
	 */
	public void onJxaGetEconomicRecordsResult(int code, int type,
			boolean hasMore, ArrayList<EconomicRecords> economicRecords);

	/**
	 * 当服务器响应获取充值套餐时，此回调将被执行
	 * 
	 * @param code
	 *            0 表示更改成功，其他为失败
	 * @param type
	 *            充值类型，当前支持"rmb"、"dollar"
	 * @param rechargeItems
	 *            当且仅当code为0时，数据有效
	 */
	public void onJxaGetRechagePriceResult(int code, String type,
			ArrayList<RechargeItem> rechargeItems);

	/************************************** 道具系统 *****************************************************/

	/**
	 * 解析服务器下发的道具商城列表回执
	 * 
	 * @param propslist
	 */
	public void onJxaGetPropsMallListResult(final int code,
			ArrayList<Props> propslist);

	/**
	 * 解析服务器下发的道具购买信息列表回执
	 * 
	 * @param propslist
	 */
	public void onJxaGetCurrentBuyPropsInfoResult(final int code,
			ArrayList<Prop> propslist, Prop curPorp, int propBuyCount);

	/**
	 * 解析服务器下发的我的道具列表
	 * 
	 * @param proplist
	 * @param propSubscribecount
	 */
	public void onJxaGetMyPropsResult(final int code, ArrayList<Prop> proplist,
			int propSubscribecount);

	/**
	 * 解析服务器下发的购买详细列表
	 * 
	 * @param proplist
	 */
	public void onJxaGetPropsPurchaseInfoListResult(final int code,
			ArrayList<Prop> proplist);

	/**
	 * 解析服务器下发的删除购买详细回执
	 * 
	 * @param bool
	 */
	public void onJxaDeletePropsPurchaseInfoListResult(final int code,
			boolean bool);

	/**
	 * 解析服务器下发的道具生效回执
	 * 
	 * @param bool
	 */
	public void onJxaEffectivePropResult(final int code, boolean bool);
};
